import sys
import os
from flask import Flask, request, jsonify, send_from_directory
from flask_cors import CORS
import requests
import logging
from logging.handlers import RotatingFileHandler
import os
# 新增以下3行：导入自动打开浏览器和多线程所需模块
import webbrowser  # 用于自动打开浏览器
import threading  # 用于多线程（避免服务器启动阻塞浏览器打开）
import time       # 用于延迟1秒，确保服务器先启动再打开浏览器

# 新增：动态获取基础路径（适配开发/打包后环境）
def get_base_path():
    """判断运行环境，返回正确的基础路径"""
    if getattr(sys, 'frozen', False):
        # 打包后exe运行：返回exe所在文件夹路径
        return os.path.dirname(sys.executable)
    else:
        # 开发环境运行：返回app.py所在文件夹路径
        return os.path.dirname(os.path.abspath(__file__))

# 新增：拼接静态文件夹路径（确保打包后能找到static）
base_path = get_base_path()
static_folder_path = os.path.join(base_path, 'static')

# 初始化 Flask 应用
app = Flask(__name__, static_folder=static_folder_path, static_url_path='')
CORS(app)  # 启用 CORS 支持

# 配置日志
logging.basicConfig(level=logging.INFO)
handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=1)
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)

# Long-Cat API 端点
LONGCAT_API_URL = "https://api.longcat.chat/openai/v1/chat/completions"

@app.route('/')
def serve_index():
    """提供前端页面"""
    app.logger.info("收到根路径请求")
    try:
        return send_from_directory('static', 'index.html')
    except Exception as e:
        app.logger.error(f"提供静态文件时出错: {str(e)}")
        return "服务器错误: 无法加载页面", 500

@app.route('/api/generate-css', methods=['POST'])
def generate_css():
    """代理请求到 Long-Cat API"""
    try:
        # 获取请求数据
        data = request.get_json()
        if not data:
            return jsonify({'error': '请求体必须是JSON格式'}), 400
            
        transcript = data.get('transcript', '')
        api_key = data.get('apiKey', '')
        
        app.logger.info(f"收到CSS生成请求: {transcript[:50]}...")
        
        if not transcript:
            return jsonify({'error': '缺少语音文本'}), 400
            
        if not api_key:
            return jsonify({'error': '缺少API密钥'}), 400
        
        # 准备请求到 Long-Cat API
        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {api_key}'
        }
        
        payload = {
            'model': 'LongCat-Flash-Chat',
            'messages': [
                {
                    'role': 'system',
                    'content': '你是一名专业的CSS工程师。根据用户描述生成简洁、美观的CSS代码。只返回CSS代码，不要解释。'
                },
                {
                    'role': 'user',
                    'content': f'根据以下描述为HTML页面生成CSS代码：{transcript}'
                }
            ],
            'max_tokens': 500
        }
        
        # 发送请求到 Long-Cat API
        response = requests.post(LONGCAT_API_URL, headers=headers, json=payload, timeout=30)
        
        # 检查响应状态
        if response.status_code != 200:
            app.logger.error(f"Long-Cat API 错误: {response.status_code} - {response.text}")
            return jsonify({'error': f'Long-Cat API 错误: {response.status_code}'}), response.status_code
        
        # 解析响应
        result = response.json()
        
        if 'choices' in result and len(result['choices']) > 0:
            css_code = result['choices'][0]['message']['content']
            return jsonify({'css': css_code})
        else:
            app.logger.error(f"Long-Cat API 响应格式错误: {result}")
            return jsonify({'error': 'API响应格式不正确'}), 500
            
    except requests.exceptions.Timeout:
        app.logger.error("请求超时")
        return jsonify({'error': '请求超时，请稍后重试'}), 504
    except requests.exceptions.ConnectionError:
        app.logger.error("连接错误")
        return jsonify({'error': '无法连接到API服务'}), 503
    except Exception as e:
        app.logger.error(f"服务器错误: {str(e)}")
        return jsonify({'error': f'服务器内部错误: {str(e)}'}), 500

@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': '端点不存在'}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({'error': '服务器内部错误'}), 500

if __name__ == '__main__':
    # 获取端口，默认为 7777
    port = int(os.environ.get('PORT', 7777))
    # 拼接要访问的URL（localhost + 端口）
    url = f"http://localhost:{port}"
    
    def start_server():
        """子线程：启动Flask服务器（避免阻塞浏览器打开）"""
        app.logger.info(f"启动服务器，监听 {url}")
        app.run(host='0.0.0.0', port=port, debug=False, use_reloader=False)
        # 注意：加 use_reloader=False 是防止Flask自动重启时重复启动服务器（开发模式特性）
    
    def open_browser():
        """主线程：延迟1秒后打开浏览器（确保服务器先就绪）"""
        time.sleep(1)  # 延迟1秒（可调整，确保服务器启动完成）
        app.logger.info(f"自动打开浏览器访问：{url}")
        webbrowser.open(url)  # 调用系统默认浏览器打开URL
    
    # 1. 用子线程启动服务器（子线程不阻塞主线程）
    server_thread = threading.Thread(target=start_server)
    server_thread.daemon = True  # 设为守护线程：关闭控制台时服务器自动退出
    server_thread.start()
    
    # 2. 主线程执行：打开浏览器
    open_browser()
    
    # 3. 保持主线程运行（否则子线程会随主线程退出而关闭）
    server_thread.join()